package com.tencent.ncnnyolox.basemodule.utils;

import android.annotation.SuppressLint;
import android.text.format.Time;


import com.blankj.utilcode.util.LogUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 功能描述：
 *
 * @author Administrator
 * @version 1.0
 * @Date Jul 19, 2008
 * @Time 9:47:53 AM
 */
public class DateUtil {

    public static Calendar calendar = null;

    public static final String YYMMDD = "yyMMdd";

    /**
     * 功能描述：格式化日期
     *
     * @param dateStr String 字符型日期
     * @param format  String 格式
     * @return Date 日期
     */
    @SuppressLint("SimpleDateFormat")
    public static Date parseDate(String dateStr, String format) {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat(format);
            String dt = dateStr.replaceAll("-", "/");
            if ((!dt.equals("")) && (dt.length() < format.length())) {
                dt += format.substring(dt.length()).replaceAll("[YyMmDdHhSs]", "0");
            }
            return (Date) dateFormat.parse(dt);
        } catch (Exception e) {
            LogUtils.e("时间转化错误：" + e.getMessage());
            return new Date();
        }
    }

    /**
     * 功能描述：格式化日期
     *
     * @param dateStr String 字符型日期：YYYY-MM-DD 格式
     * @return Date
     */
    public static Date parseDate(String dateStr) {
        return parseDate(dateStr, "yyyy/MM/dd");
    }

    /**
     * 功能描述：格式化日期
     * @param dateStr String 字符型日期：YYMMDD 格式
     * @return Date
     */
    public static Date parseDateYYMMDD(String dateStr) {
        return parseDate(dateStr, YYMMDD);
    }

    /**
     * 功能描述：格式化输出日期
     *
     * @param date   Date 日期
     * @param format String 格式
     * @return 返回字符型日期
     */
    @SuppressLint("SimpleDateFormat")
    public static String format(Date date, String format) {
        String result = "";
        try {
            if (date != null) {
                SimpleDateFormat dateFormat = new SimpleDateFormat(format);
                result = dateFormat.format(date);
            }
        } catch (Exception e) {
            LogUtils.e("时间转化错误：" + e.getMessage());
        }
        return result;
    }

    /**
     * 功能描述：
     *
     * @param date Date 日期
     * @return
     */
    public static String format(Date date) {
        return format(date, "yyyy/MM/dd");
    }

    /**
     * 功能描述：返回年份
     *
     * @param date Date 日期
     * @return 返回年份
     */
    public static int getYear(Date date) {
        calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.YEAR);
    }

    /**
     * 功能描述：返回月份
     *
     * @param date Date 日期
     * @return 返回月份
     */
    public static int getMonth(Date date) {
        calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MONTH) + 1;
    }

    /**
     * 功能描述：返回日份
     *
     * @param date Date 日期
     * @return 返回日份
     */
    public static int getDay(Date date) {
        calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 功能描述：返回小时
     *
     * @param date 日期
     * @return 返回小时
     */
    public static int getHour(Date date) {
        calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.HOUR_OF_DAY);
    }

    /**
     * 功能描述：返回分钟
     *
     * @param date 日期
     * @return 返回分钟
     */
    public static int getMinute(Date date) {
        calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MINUTE);
    }

    /**
     * 返回秒钟
     *
     * @param date Date 日期
     * @return 返回秒钟
     */
    public static int getSecond(Date date) {
        calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.SECOND);
    }

    /**
     * 功能描述：返回毫秒
     *
     * @param date 日期
     * @return 返回毫秒
     */
    public static long getMillis(Date date) {
        calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.getTimeInMillis();
    }

    /**
     * 功能描述：返回字符型日期
     *
     * @param date 日期
     * @return 返回字符型日期 yyyy/MM/dd 格式
     */
    public static String getDate(Date date) {
        return format(date, "yyyy/MM/dd");
    }

    /**
     * 功能描述：返回字符型时间
     *
     * @param date Date 日期
     * @return 返回字符型时间 HH:mm:ss 格式
     */
    public static String getTime(Date date) {
        return format(date, "HH:mm:ss");
    }

    /**
     * 功能描述：返回字符型日期时间
     *
     * @param date Date 日期
     * @return 返回字符型日期时间 yyyy/MM/dd HH:mm:ss 格式
     */
    public static String getDateTime(Date date) {
        return format(date, "yyyy/MM/dd HH:mm:ss");
    }

    /**
     * 功能描述：返回字符型日期时间
     *
     * @param date Date 日期
     * @return 返回字符型日期时间 yyyy-MM-dd HH:mm:ss 格式
     */
    public static String getDateTime4(Date date) {
        return format(date, "yyyy-MM-dd HH:mm:ss");
    }
    /**
     * @param date Date 日期
     * @return 返回字符型日期时间 yyyy/MM/dd HH:mm:ss 格式
     */
    public static String getDateTime5(Date date) {
        return format(date, "yyyy-MM-dd");
    }


    /**
     * @param date
     * @return 返回字符型日期时间 yyyyMMddHHmmss 格式
     */
    public static String getDateTimeStr(Date date) {
        return format(date, "yyyyMMddHHmmss");
    }

    /**
     * 功能描述：日期相加
     *
     * @param date Date 日期
     * @param day  int 天数
     * @return 返回相加后的日期
     */
    public static Date addDate(Date date, int day) {
        calendar = Calendar.getInstance();
        long millis = getMillis(date) + ((long) day) * 24 * 3600 * 1000;
        calendar.setTimeInMillis(millis);
        return calendar.getTime();
    }

    /**
     * 功能描述：
     *
     * @param date Date 日期
     * @param day  int 天数
     * @return 返回相加后的日期
     */
    public static Date diffDate(Date date, int day) {
        calendar = Calendar.getInstance();
        long millis = getMillis(date) - ((long) day) * 24 * 3600 * 1000;
        calendar.setTimeInMillis(millis);
        return calendar.getTime();
    }

    /**
     * 功能描述：日期相减
     *
     * @param date  Date 日期
     * @param date1 Date 日期
     * @return 返回相减后的日期
     */
    public static int diffDate(Date date, Date date1) {
        return (int) ((getMillis(date) - getMillis(date1)) / (24 * 3600 * 1000));
    }

    /**
     * 功能描述：取得指定月份的第一天
     *
     * @param strdate String 字符型日期
     * @return String yyyy-MM-dd 格式
     */
    public static String getMonthBegin(String strdate) {
        return format(parseDate(strdate), "yyyy-MM") + "-01";
    }

    /**
     * 功能描述：取得指定月份的最后一天
     *
     * @param strdate String 字符型日期
     * @return String 日期字符串 yyyy-MM-dd格式
     */
    public static String getMonthEnd(String strdate) {
        Date date = parseDate(getMonthBegin(strdate));
        calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.DAY_OF_YEAR, -1);
        return formatDate(calendar.getTime());
    }

    /**
     * 功能描述：常用的格式化日期
     *
     * @param date Date 日期
     * @return String 日期字符串 yyyy-MM-dd格式
     */
    public static String formatDate(Date date) {
        return formatDateByFormat(date, "yyyy-MM-dd");
    }

    /**
     * 功能描述：以指定的格式来格式化日期
     *
     * @param date   Date 日期
     * @param format String 格式
     * @return String 日期字符串
     */
    @SuppressLint("SimpleDateFormat")
    public static String formatDateByFormat(Date date, String format) {
        String result = "";
        if (date != null) {
            try {
                SimpleDateFormat sdf = new SimpleDateFormat(format);
                result = sdf.format(date);
            } catch (Exception ex) {
                LogUtils.e("[formatDateByFormat]" + ex.getMessage());
            }
        }
        return result;
    }

    public static String getFormatNowTime() {
        Date date = new Date();

        return getDateTime(date);

    }

    /**
     *
     * @return 返回现在 yyyyMMddHHmmss格式时间
     */
    public static String getFormatNowTimeStr() {
        Date date = new Date();

        return getDateTimeStr(date);

    }

    public static void main(String[] args) {
        Date d = new Date();
        System.out.println("长度：" + "".length());
    }

    /**
     * 通过和今日的天数差异获得date
     *
     * @param count
     * @return date
     */
    public static Date getDate(int count) {
        Calendar d = Calendar.getInstance();
        int year = d.get(Calendar.YEAR);
        int month = d.get(Calendar.MONTH);
        int day = d.get(Calendar.DAY_OF_MONTH);
        d.set(year, month, day + count);
        Date date = d.getTime();
        return date;
    }

    /**
     * 功能描述：返回字符型日期时间
     *
     * @param date Date 日期
     * @return 返回字符型日期时间 yyyyMMdd 格式
     */
    public static String getDateTime3(Date date) {
        return format(date, "yyyyMMdd");
    }

    public static String getYearYY(Date date) {
        return new SimpleDateFormat("yyyy-MM-dd").format(date);
    }

    public static String getYearYY() {
        return new SimpleDateFormat("yyyy-MM-dd").format(new Date());
    }

    /**
     * 功能描述：返回字符型日期时间
     *
     * @param date
     *            Date 日期
     * @return 返回字符型日期时间 yyyyMMddHHmmss 格式
     */
    public static String getDateTime2(Date date) {
        return format(date, "yyyyMMddHHmmss");
    }

    public static String getPassword() {
        String dateString = getDateTime3(new Date());//170728
        String contentStr = dateString.substring(2, dateString.length());
        int value = 0;
        for (int i = 0; i < contentStr.length(); i++) {
            value += Integer.parseInt(contentStr.substring(i, i + 1));
        }//1+7+7+10=25
        int mol = value % 10;//5
        int mol2 = mol * 2 % 5;//0
        return contentStr + mol + mol2;//17072850
    }

    public static String timeStamp() {
        //获取当前时间戳
        long timeStamp = System.currentTimeMillis();
        String time = String.valueOf(timeStamp);
        return time;
    }
    /**
     * 功能描述：返回校验崩溃日志的名字
     */
    public static String getCrashLogName() {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
        String  data = "";
        data = simpleDateFormat.format(new Date());
        return data;
    }

    /**
     * 功能描述：返回校验应用日志的名字
     */
    public static String getLogName() {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String  data = "";
        data = simpleDateFormat.format(new Date());
        return data;
    }

    /**
     * 功能描述：返回校验崩溃日志的时间戳
     */
    public static long getCrashLogMillis(String data) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
        long millis = 0L;
        try {
            millis = simpleDateFormat.parse(data).getTime();
        } catch (ParseException e) {
            LogUtils.e("[getCrashLogMillis]：" + e.getMessage());
        }
        return millis;
    }

    public static long getMillis(String data) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long millis = 0L;
        try {
            millis = simpleDateFormat.parse(data).getTime();
        } catch (ParseException e) {
            LogUtils.e("[getMillis]：" + e.getMessage());
        }
        return millis;
    }

    /**
     * 功能描述：返回校验应用日志的时间戳
     */
    public static long getAppLogMillis(String data) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
        long millis = 0L;
        try {
            millis = simpleDateFormat.parse(data).getTime();
        } catch (ParseException e) {
            LogUtils.e("[getAppLogMillis]：" + e.getMessage());
        }
        return millis;
    }

    /**
     * 功能描述：返回校验SO版本号的时间戳
     */
    public static long getSOMillis(String data) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyMMdd");
        long millis = 0L;
        try {
            millis = simpleDateFormat.parse(data).getTime();
        } catch (ParseException e) {
            LogUtils.e("[getSOMillis]：" + e.getMessage());
        }
        return millis;
    }

    /**
     * 功能描述：返回校验崩溃日志的时间戳
     */
    public static long getLogMillis(String data) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        long millis = 0L;
        try {
            millis = simpleDateFormat.parse(data).getTime();
        } catch (ParseException e) {
            LogUtils.e("[getLogMillis]：" + e.getMessage());
        }
        return millis;
    }

    /**
     * 将时间戳转化为时间长度
     * @param mss
     * @return
     */
    public static String getTimeStr(long mss) {
        mss = mss /1000;
        String DateTimes = null;
        long days = mss / ( 60 * 60 * 24);
        long hours = (mss % ( 60 * 60 * 24)) / (60 * 60);
        long minutes = (mss % ( 60 * 60)) /60;
        long seconds = mss % 60;
        if(days>0){
            DateTimes= days + "天" + hours + "小时" + minutes + "分钟" + seconds + "秒";
        }else if(hours>0){
            DateTimes=hours + "小时" + minutes + "分钟" + seconds + "秒";
        }else if(minutes>0){
            DateTimes=minutes + "分钟" + seconds + "秒";
        }else{
            DateTimes=seconds + "秒";
        }
        return DateTimes;
    }

    public static long getMonthFirstDay() {
        Calendar calendar = Calendar.getInstance();// 获取当前日期
        calendar.add(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        System.out.println(calendar.getTimeInMillis());
        return calendar.getTimeInMillis();
    }

    /**
     * 判断是否在时间段以内（单位小时）
     * @param startTime
     * @param endTime
     * @return
     */
    public static boolean judgeInTime(int startTime,int endTime){
        boolean flag = false;
        Calendar calendar = Calendar.getInstance();
        int presentHour = calendar.get(Calendar.HOUR_OF_DAY);
        if (presentHour >= startTime && presentHour < endTime){
            flag = true;
        }
        return flag;
    }


    /**
     * 获取当天的开始时间
     * @param date
     * @return
     */
    public static Date getToDayStartMillieDate(Date date){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        //将小时至0
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        //将分钟至0
        calendar.set(Calendar.MINUTE, 0);
        //将秒至0
        calendar.set(Calendar.SECOND,0);
        return calendar.getTime();
    }

    /**
     * 获取当天的结束时间
     * @param date
     * @return
     */
    public static Date getToDayEndMillieDate(Date date){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        //将小时至23
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        //将分钟至59
        calendar.set(Calendar.MINUTE, 59);
        //将秒至59
        calendar.set(Calendar.SECOND,59);
        return calendar.getTime();
    }

    /***
     *
     * @param beginHour 开始小时       比如   23
     * @param beginMin  开始小时的分钟  比如  00
     * @param endHour   结束小时        比如  5
     * @param endMin    结束小时的分钟   比如 00
     * @return         true表示范围内   否则false
     */
    public static boolean atTheCurrentTime(int beginHour, int beginMin, int endHour, int endMin) {
        boolean result = false;
        final long aDayInMillis = 1000 * 60 * 60 * 24;
        final long currentTimeMillis = System.currentTimeMillis();
        Time now = new Time();
        now.set(currentTimeMillis);
        Time startTime = new Time();
        startTime.set(currentTimeMillis);
        startTime.hour = beginHour;
        startTime.minute = beginMin;
        Time endTime = new Time();
        endTime.set(currentTimeMillis);
        endTime.hour = endHour;
        endTime.minute = endMin;
        /**跨天的特殊情况(比如23:00-2:00)*/
        if (!startTime.before(endTime)) {
            startTime.set(startTime.toMillis(true) - aDayInMillis);
            result = !now.before(startTime) && !now.after(endTime); // startTime <= now <= endTime
            Time startTimeInThisDay = new Time();
            startTimeInThisDay.set(startTime.toMillis(true) + aDayInMillis);
            if (!now.before(startTimeInThisDay)) {
                result = true;
            }
        } else {
            /**普通情况(比如5:00-10:00)*/
            result = !now.before(startTime) && !now.after(endTime); // startTime <= now <= endTime
        }
        return result;
    }


}
